import Vue from 'vue'
import Vuex from 'vuex'
import user from './modules/user'
import getters from './getters'
//挂载Vuex
Vue.use(Vuex)

//创建VueX对象
const store = new Vuex.Store({
    state: {
        // 存放的键值对就是所要管理的状态 可以通过this.$store.state.name读取
        //不建议在组件中直接对state中的成员进行操作，这是因为直接修改
        // (例如：this.$store.state.name = 'hello')的话不能被VueDevtools(插件)所监控到。
        name: 'helloVueX',
        id: '1297117934803492866',
    },
    mutations: {
        // 操作state数据的方法的集合，比如对该数据的修改、增加、删除等等。
        // mutations方法都有默认的形参([state],[payload])
        // state是当前VueX对象中的state
        // payload是该方法在被调用时传递参数使用的
        edit(state) {
            //而在组件中，我们需要这样去调用这个mutation——例如在App.vue的某个method中:
            // this.$store.commit('edit')
            state.name = 'king';
        },
        change(state, payload) {
            // this.$store.commit('change',15)
            // this.$store.commit('change',{age:15,sex:'男'})
            /* 另一中表达形式
            this.$store.commit({
                type:'edit',
                payload:{
                    age:15,
                    sex:'男'
                }
            })
             */
            state.name = 'jack';
            console.log(payload);
        },
        add(state) {
            /*
            为了配合Vue的响应式数据，我们在Mutations的方法中，应当使用Vue提供的方法来进行操作
             */
            Vue.set(state, "age", 15);
        },
        delete(state) {
            Vue.delete(state, 'age');
        }
    },
    actions: {
        /*
        由于直接在mutation方法中进行异步操作，将会引起数据失效。
        所以提供了Actions来专门进行异步操作，最终提交mutation方法。
        Actions中的方法有两个默认参数
           -  context 上下文(相当于箭头函数中的this)对象
           -  payload 挂载参数
         */

        // 由于setTimeout是异步操作，所以需要使用actions
        // 组件中调用 this.$store.dispatch('aEdit',{age:15})
        // 由于是异步操作，所以我们可以为我们的异步操作封装为一个Promise对象
        aEdit(context, payload) {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    context.commit('edit', payload);
                    resolve();
                }, 2000)
            })
        }

    },
    modules: {
        // 模块化管理状态
        user
    },
    getters
});

export default store;
